﻿using System;
using System.Collections.Generic;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using CapaNegocio;
using Excepciones;

namespace CapaUsuario
{
    public partial class AltaCompra : Form
    {
        private Admin admin;
        
        public AltaCompra(Admin a)
        {
            admin = a;
            InitializeComponent();
            
            dataGridView1Producto.Visible = false;
            dataGridViewCompra.Visible = false;
            button2Agregar.Visible = false;
            button3Eliminar.Visible = false;
            button4FinalizarCompra.Visible = false;
            label2DescProd.Visible = false;
            label7.Visible = false;
            label7Total.Visible = false;
            textBox5SubTotal.Visible = false;
            decimal d = 0;
            textBox5SubTotal.Text = Convert.ToString(d);
            buttonRecalcular.Visible = false;
            buttonRecalcular.Visible = false;
        }

        //BOTON FINALIZAR
        private void button5_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        //BOTON CARGAR
        private void button1_Click(object sender, EventArgs e)
        {
            buttonRecalcular.Visible = true;
            try
            {

                string tabla = "cliente";
                DataSet ds = new DataSet();

                int nroCliente = int.Parse(textBox1NroCli.Text);
                if (nroCliente == 0)
                    throw new nroInvalido();
                if (nroCliente.ToString().Length == 0)
                    throw new Blanco();

                ds = admin.buscarEnBDNroCliente(tabla, nroCliente);

                if (ds.Tables[0].Rows.Count > 0)
                {
                    //CLIENTE EXISTE
                    DataTable dt = ds.Tables[0];

                    textBox2Dni.Text = Convert.ToString(dt.Rows[0].ItemArray[0]);
                    textBox3Nombre.Text = Convert.ToString(dt.Rows[0].ItemArray[3]);
                    textBox4PuntosAcu.Text = Convert.ToString(dt.Rows[0].ItemArray[5]);

                    //COMIENZA ETAPA DE CARGA

                    dataGridView1Producto.Visible = true;
                    dataGridViewCompra.Visible = true;
                    button2Agregar.Visible = true;
                    button3Eliminar.Visible = true;
                    button4FinalizarCompra.Visible = true;
                    label2DescProd.Visible = true;
                    label7.Visible = true;
                    label7Total.Visible = true;
                    textBox5SubTotal.Visible = true;
                    buttonRecalcular.Visible = true;

                    //carga todos los productos al DataGridViewProductos
                    dataGridView1Producto.DataSource = admin.listar("producto");
                    //establece la propiedad ReadOnly como true a algunas columnas para que no las edite
                    foreach (DataGridViewRow row in dataGridView1Producto.Rows)
                    {
                        row.Cells["seleccion"].ReadOnly = false;
                        row.Cells["descripcion"].ReadOnly = true;
                        row.Cells["nroproducto"].ReadOnly = true;
                        row.Cells["precio"].ReadOnly = true;
                        row.Cells["stock"].ReadOnly = true;
                     }

                    //FIN ETAPA DE CARGA - COMIENZA ETAPA DE COMPRA

                }
                else
                {
                    //CLIENTE NO EXISTE
                    MessageBox.Show("ERROR: el cliente no existe");
                    this.Close();
                }

            }//fin try

            catch (Blanco ex)
            {
                MessageBox.Show(ex.Message);
            }
            catch (nroInvalido ex)
            {
                MessageBox.Show(ex.Message);
            }
            catch (FormatException ex)
            {
                MessageBox.Show(ex.Message);
            }
            catch (OverflowException ex)
            {
                MessageBox.Show(ex.Message);
            }
        }


        //BOTON AGREGAR (AGREGA UN PRODUCTO A GRIDVIEW DE COMPRAS)
        private void button2Agregar_Click(object sender, EventArgs e)
        {
            try
            {


                // Se define una lista temporal de registro seleccionados
                List<DataGridViewRow> rowSelected = new List<DataGridViewRow>();

                foreach (DataGridViewRow row in dataGridView1Producto.Rows)
                {
                    DataGridViewCheckBoxCell cellSelecion = row.Cells["seleccion"] as DataGridViewCheckBoxCell;

                    if (Convert.ToBoolean(cellSelecion.Value))
                        rowSelected.Add(row);
                }
                // Se agrega el item seleccionado a la grilla de destino
                // eliminando la fila de la grilla original

                foreach (DataGridViewRow row in rowSelected)
                {
                    dataGridViewCompra.Rows.Add(new object[] { false, row.Cells["nroProducto"].Value, row.Cells["descripcion"].Value, row.Cells["precio"].Value, row.Cells["stock"].Value,1 });
                    dataGridView1Producto.Rows.Remove(row);

                }
                //luego de agregar actualizo el total de la compra
                decimal total = 0;
                foreach (DataGridViewRow row in dataGridViewCompra.Rows)
                {

                    total += Convert.ToInt32(row.Cells["cantidad"].Value) * Convert.ToDecimal(row.Cells["precio"].Value);
                }
              textBox5SubTotal.Text = total.ToString();
                

            }


            catch (InvalidOperationException ex)
            {
                MessageBox.Show(ex.Message);
            }
            catch (InvalidCastException ex)
            {
                MessageBox.Show(ex.Message);
            }
            catch (OverflowException ex)
            {
                MessageBox.Show(ex.Message);
            }
            catch (FormatException ex)
            {
                MessageBox.Show(ex.Message);
            }

        }


        private void button4FinalizarCompra_Click(object sender, EventArgs e)
        {
            try
            {
                int cantidad, stock, nroCliente = 0;
                decimal importe = 0;
                DateTime fechaCompra = DateTime.Today;
                List<LineaCompra> linea = new List<LineaCompra>();
                DataTable dt;
                Producto producto;
                LineaCompra lineaCompra;
                foreach (DataGridViewRow row in dataGridViewCompra.Rows)
                {
                    cantidad = Convert.ToInt32(row.Cells["cantidad"].Value);
                    stock = Convert.ToInt32(row.Cells["stock"].Value);
                    if (cantidad > stock)
                        throw new cantidadInvalida();
                    if (cantidad.ToString().Length == 0)
                        throw new Blanco();
                    if (cantidad == 0)
                        throw new StockInvalido();
                    nroCliente = int.Parse(textBox1NroCli.Text);
                    importe = decimal.Parse(textBox5SubTotal.Text);
                    //tengo que buscar el objeto producto
                    dt = admin.buscarProduc((int)row.Cells["nroProducto"].Value);
                    producto = new Producto((int)dt.Rows[0].ItemArray[0],(string)dt.Rows[0].ItemArray[1], (decimal)dt.Rows[0].ItemArray[2], (int)dt.Rows[0].ItemArray[3]);
                    lineaCompra = new LineaCompra(producto, cantidad);
                    linea.Add(lineaCompra);
                    
                }

                if (linea.Count == 0)
                    throw new listaVacia();
                if (admin.altaCompra(nroCliente, linea, fechaCompra, importe) == true)
                    MessageBox.Show("la compra fue realizada con exito ");
                this.Close();

            }
            catch (Blanco ex)
            {
                MessageBox.Show(ex.Message);
            }
            catch (cantidadInvalida ex)
            {
                MessageBox.Show(ex.Message);
            }
            catch (FormatException ex)
            {
                MessageBox.Show(ex.Message);
            }
            catch (StockInvalido ex)
            {
                MessageBox.Show(ex.Message);
            }
            catch (listaVacia ex)
            {
                MessageBox.Show(ex.Message);
            }
           

        }

        private void buttonRecalcular_Click(object sender, EventArgs e)
        {
            try
            {

                int cantidad = Convert.ToInt32(dataGridViewCompra.CurrentRow.Cells["cantidad"].Value);
                int stock = Convert.ToInt32(dataGridViewCompra.CurrentRow.Cells["stock"].Value);
                if (cantidad > stock)
                    throw new cantidadInvalida();
                if (cantidad.ToString().Length == 0)
                    throw new Blanco();
                decimal total = 0;

                foreach (DataGridViewRow row in dataGridViewCompra.Rows)
                {

                    total += Convert.ToInt32(row.Cells["cantidad"].Value) * Convert.ToDecimal(row.Cells["precio"].Value);

                }



                textBox5SubTotal.Text = total.ToString();
            }
            catch (cantidadInvalida ex)
            {
                MessageBox.Show(ex.Message);
            }
            catch (NullReferenceException ex)
            {
                MessageBox.Show(ex.Message);
            }
            catch (FormatException ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void button3Eliminar_Click(object sender, EventArgs e)
        {


            try
            {
                //arraylist de nroProductos de los registros No seleccionados
                ArrayList listaNrosProductos = new ArrayList();
                // Se define una lista temporal de registro seleccionados y no seleccionados
                //

                List<DataGridViewRow> rowSelected = new List<DataGridViewRow>();
                List<DataGridViewRow> rowNoSelected = new List<DataGridViewRow>();

                // Se recorre cada fila de la grilla de seleccion y se determian que registros estan checkeados

                foreach (DataGridViewRow row in dataGridViewCompra.Rows)
                {

                    DataGridViewCheckBoxCell cellSelecion = row.Cells["seleccionSel"] as DataGridViewCheckBoxCell;

                    if (Convert.ToBoolean(cellSelecion.Value))


                        rowSelected.Add(row);
                    else
                        rowNoSelected.Add(row);

                }

                if (rowSelected.Count > 0)
               {

                    //borro los registros que se han seleccionado
                    foreach (DataGridViewRow row in rowSelected)
                    {

                        dataGridViewCompra.Rows.Remove(row);
                    }
                    if (rowNoSelected.Count > 0)
                    {
                        //los registros no seleccionados no deberan aparecer en el
                        //dataGridViewPoductos cuando se refresque
                        int nroProd;
                        foreach (DataGridViewRow row in rowNoSelected)
                        {
                            nroProd = Convert.ToInt32(row.Cells["nroproducto"].Value);
                            listaNrosProductos.Add(nroProd);
                            

                        }


                        dataGridView1Producto.DataSource = admin.listarProductos(listaNrosProductos);
                    }
                    else
                        dataGridView1Producto.DataSource = admin.listar("producto");
                    //despues de eliminar tiene que recalcular el total de la compra
                    decimal total = 0;

                    foreach (DataGridViewRow row in dataGridViewCompra.Rows)
                    {

                        total += Convert.ToInt32(row.Cells["cantidad"].Value) * Convert.ToDecimal(row.Cells["precio"].Value);

                    }
                    textBox5SubTotal.Text = total.ToString();
               }
                else
                    throw new NoSeleccionoNada();
            }




            catch (InvalidOperationException ex)
            {
                MessageBox.Show(ex.Message);
            }
            catch (InvalidCastException ex)
            {
                MessageBox.Show(ex.Message);
            }
            catch (OverflowException ex)
            {
                MessageBox.Show(ex.Message);
            }
            catch (FormatException ex)
            {
                MessageBox.Show(ex.Message);
            }
            catch (NoSeleccionoNada ex)
            {
                MessageBox.Show(ex.Message);
            }
            
         }






        }
    }

